import { ArgumentsHost, Catch, ExceptionFilter } from '@nestjs/common'
import { Response } from 'express'
import { QueryFailedError, TypeORMError } from 'typeorm'

@Catch(TypeORMError)
export class TypeormFilter implements ExceptionFilter {
  catch(exception: TypeORMError, host: ArgumentsHost) {
    const ctx = host.switchToHttp() // HTTP 请求上下文。
    let code = 500
    let message = exception.message
    if (exception instanceof QueryFailedError) {
      const driverError = (exception as QueryFailedError).driverError as unknown
      if (driverError && typeof driverError === 'object') {
        const possibleErroe = (driverError as Record<string, unknown>)['errno']
        if (typeof possibleErroe === 'number') {
          code = possibleErroe
        }
      }
      message = '数据库错误：' + exception.message || '数据库查询失败'
    }
    //响应请求对象
    const response = ctx.getResponse<Response>() //获取 HTTP 响应对象。
    response.status(500).json({
      //使用 response 对象返回一个自定义的错误响应。该响应是一个 JSON 格式的对象
      code: code, //状态码，等于捕获的异常的状态码，可以定义sql的错误码
      timeStamp: new Date().toISOString(), //当前时间戳，表示响应的时间
      message //异常的消息，默认为异常的 message 或者 HttpException.name
    })
  }
}
